package jdk7;

import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;
import java.util.Arrays;
import java.util.List;

// JSR 292: Supporting Dynamically Typed Languages on the JavaTM Platform，
// 支持在JVM上运行动态类型语言。在字节码层面支持了InvokeDynamic。

public class InvokeDynamic {

	public static void main(String[] args) {
		try {
			// MethodType(方法签名)表示方法句柄接受和返回的参数和返回类型，或者方法句柄调用者传递和期望的参数和返回类型。
			// 第一个参数 必需有表示方法的返回类型 如果是void 则用void.class
			// 第二个参数为可变长参数，表示方法参数列表的类型
			MethodType methodType = MethodType.methodType(List.class, String.class);

			// public方法的Lookup
			// MethodHandles.Lookup publicLookup = MethodHandles.publicLookup();
			// 所有方法的Lookup
			MethodHandles.Lookup lookup = MethodHandles.lookup();

			// 分别是定义方法的类，方法名，签名
			MethodHandle methodHandle = lookup.findVirtual(Enhance.class, "toList", methodType);

			// 调用方法句柄，允许任何调用者类型描述符，以及可选地对参数和返回值执行转换。
			List<String> list = (List<String>) methodHandle.invoke(Enhance.class.getDeclaredConstructor().newInstance(),
					"[1,2]");

			for (String string : list) {
				System.out.println(string);
			}

		} catch (Throwable e) {
			e.printStackTrace();
		}
	}
}

class Enhance {

	public List<String> toList(String listString) {
		String substring = listString.substring(1, listString.length() - 1);
		String[] split = substring.split(",");
		return Arrays.asList(split);
	}

}